package cn.xtcode.infrastructure.adapter.repository;

import cn.xtcode.domain.tag.adapter.repository.ITagRepository;
import cn.xtcode.domain.tag.model.entity.CrowdTagsDetailEntity;
import cn.xtcode.domain.tag.model.entity.CrowdTagsJobEntity;
import cn.xtcode.infrastructure.dao.CrowdTagsDetailMapper;
import cn.xtcode.infrastructure.dao.CrowdTagsJobMapper;
import cn.xtcode.infrastructure.dao.CrowdTagsMapper;
import cn.xtcode.infrastructure.dao.po.CrowdTags;
import cn.xtcode.infrastructure.dao.po.CrowdTagsDetail;
import cn.xtcode.infrastructure.dao.po.CrowdTagsJob;
import cn.xtcode.infrastructure.redis.IRedisService;
import cn.xtcode.infrastructure.redis.RedissonService;
import cn.xtcode.types.enums.ResponseCode;
import cn.xtcode.types.exception.AppException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @Author xt-code
 * @Description:
 * @Create 2025/5/7 15:24
 */
@Slf4j
@Repository
public class TagRepository implements ITagRepository {
    @Resource
    private CrowdTagsJobMapper crowdTagsJobMapper;

    @Resource
    private CrowdTagsDetailMapper crowdTagsDetailMapper;

    @Resource
    private IRedisService redisService;

    @Resource
    private CrowdTagsMapper crowdTagsMapper;


    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJobReq = new CrowdTagsJob();
        crowdTagsJobReq.setTagId(tagId);
        crowdTagsJobReq.setBatchId(batchId);

        CrowdTagsJob crowdTagsJobRes = crowdTagsJobMapper.queryCrowdTagsJob(crowdTagsJobReq);

        if(null == crowdTagsJobRes) return null;


        return CrowdTagsJobEntity.builder()
                .tagType(crowdTagsJobRes.getTagType())
                .tagRule(crowdTagsJobRes.getTagRule())
                .statStartTime(crowdTagsJobRes.getStatStartTime())
                .statEndTime(crowdTagsJobRes.getStatEndTime())
                .build();
    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {
        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setTagId(tagId);
        crowdTagsDetailReq.setUserId(userId);


        try {
            crowdTagsDetailMapper.addCrowdTagsUserId(crowdTagsDetailReq);
            //这里数据涉及一次转换
            RBitSet bitSet = redisService.getBitSet(tagId);
            bitSet.set(redisService.getIndexFromUserId(userId), true);
        } catch (DuplicateKeyException ignored) {
            //忽略唯一索引冲突
        }
    }

    //之前已经有标签了，现在对标签记录更新
    @Override
    public void updateCrowdTagsUserId(String tagId, String userId) {
        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setTagId(tagId);
        crowdTagsDetailReq.setUserId(userId);
        crowdTagsDetailReq.setUpdateTime(new Date());

        try {
            crowdTagsDetailMapper.updateCrowdTagsDetailTime(crowdTagsDetailReq);
            //这里数据涉及一次转换
            RBitSet bitSet = redisService.getBitSet(tagId);
            bitSet.set(redisService.getIndexFromUserId(userId), true);
        } catch (DuplicateKeyException ignored) {
            //忽略唯一索引冲突
        }
    }


    @Override
    public void updateCrowdTagsStatistics(String tagId, int count) {
        CrowdTags crowdTagsReq = new CrowdTags();
        crowdTagsReq.setTagId(tagId);
        crowdTagsReq.setStatistics(count);

        crowdTagsMapper.updateCrowdTagsStatistics(crowdTagsReq);
    }

    @Override
    public CrowdTagsDetailEntity queryCrowdTagsDetailEntityByTagIdAndUserID(String tagId, String userId) {
        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setTagId(tagId);
        crowdTagsDetailReq.setUserId(userId);
        CrowdTagsDetail crowdTagsDetailRes = crowdTagsDetailMapper.queryCrowdTagsDetailByTagidAndUserid(crowdTagsDetailReq);
        if(crowdTagsDetailRes == null) return null;

        CrowdTagsDetailEntity crowdTagsDetailEntity = new CrowdTagsDetailEntity();
        crowdTagsDetailEntity.setCreateTime(crowdTagsDetailRes.getCreateTime());
        crowdTagsDetailEntity.setUpdateTime(crowdTagsDetailRes.getUpdateTime());
        return crowdTagsDetailEntity;
    }


}
